﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL.AbstractRepositories;

namespace DAL.Repositorios
{

    public class DiasHorarioRepository : AbstractRepository<HorarioDia>
    {
        

        public override void Insert(HorarioDia entity)
        {
            Inserted.Add(entity);
        }

        public override void Delete(HorarioDia entity)
        {
            Deleted.Add(entity);
        }

        public override void Update(HorarioDia entity)
        {
            Updated.Add(entity);
        }

       
        public override IEnumerable<HorarioDia> GetAll()
        {
          
            DataSet ds = GetDataSet(DBNull.Value, DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearHorario(dr.Field<int>("IdHorario"), dr);


        }

        public override HorarioDia GetById(int id)
        {
            HorarioDia horario = null;
            DataSet ds = GetDataSet(id, DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                horario = crearHorario(id, dr);



            return horario;
        }

        internal static IList<HorarioDia> horarioDiaFuncionario( int idFuncionario){


            IList<HorarioDia> listacorreo = new List<HorarioDia>();
            DataSet ds = GetDataSet(DBNull.Value, idFuncionario);

            foreach (DataRow dr in ds.Tables[0].Rows)
            {

                listacorreo.Add(
                   crearHorario(dr.Field<int>("IdHorario"), dr)
                );
            }

            return listacorreo.Count > 0 ? listacorreo : null;
        }

        protected override void UpdateEntity(HorarioDia h){

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdHorario", h.Id));
                cmd.Parameters.Add(new SqlParameter("@IdUsuario", h.IdFuncionario));
                cmd.Parameters.Add(new SqlParameter("@IdDia", (int)h.Dia));
                cmd.Parameters.Add(new SqlParameter("@HoraEntrada", h.HoraDeEntrada.Ticks));
                cmd.Parameters.Add(new SqlParameter("@HoraSalida", h.HoraDeSalida.Ticks));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaModificarHorarioDia");
        }
        protected override void InsertEntity(HorarioDia h)
        {

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdUsuario", h.IdFuncionario));
                cmd.Parameters.Add(new SqlParameter("@IdDia", (int)h.Dia));
                cmd.Parameters.Add(new SqlParameter("@HoraEntrada", h.HoraDeEntrada.Ticks));
                cmd.Parameters.Add(new SqlParameter("@HoraSalida", h.HoraDeSalida.Ticks));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaRegistrarHorarioDia");          
        }

        protected override void DeleteEntity(HorarioDia h)
        {
                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdHorario", h.IdFuncionario));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaEliminarHorarioDia");
        }

        private static HorarioDia crearHorario( int id , DataRow dr) {

            return new HorarioDia(
               idHorario: dr.Field<int>("IdHorario"),
               idFuncionario: dr.Field<int>("IdUsuario"),
               dia: (DiasSemana) dr.Field<int>("IdDia"),
               horaDeEntrada: new TimeSpan(dr.Field<long>("HoraEntrada")),
               horaDeSalida: new TimeSpan(dr.Field<long>("HoraSalida"))
                       
                );
        }

        private static DataSet GetDataSet( object idH, object idF){
            
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdHorario", idH));
            cmd.Parameters.Add(new SqlParameter("@IdFuncionario", idF));
            
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarHorarioGeneral");

            return ds;

        }
    }
}
